package com.xj.algorithm.leetcode;

/**
 * 两整数之和
 */
public class L371_不使用加号进行加法操作 {

    /**
     *不使用运算符 + 和 - ​​​​​​​，计算两整数 ​​​​​​​a 、b ​​​​​​​之和。
     *
     * 示例 1:
     *
     * 输入: a = 1, b = 2
     * 输出: 3
     * 示例 2:
     *
     * 输入: a = -2, b = 3
     * 输出: 1
     */
    public static void main(String[] args) {
        System.out.println(getSum(1,2));
        System.out.println(getSum(-2,3));
    }

    //官方解法：加法的位运算的本质，是异或运算+与运算作为进位
    /**
     * a + b 的问题拆分为 (a 和 b 的无进位结果) + (a 和 b 的进位结果)
     * 无进位加法使用异或运算计算得出
     * 进位结果使用与运算和移位运算计算得出
     * 循环此过程，直到进位为 0
     */
    public static int getSum(int a, int b) {
        while(b!=0)
        {
            int res = (a&b)<<1;
            a = a^b;
            b = res;
            System.out.println("a="+a+",b="+b+",res="+res);
        }
        return a;
    }

}
